#include <iostream>
#include "d_Math.h"

using namespace d_Math;

d_Vec3f::d_Vec3f()
{
	p[0] = p[1] = p[2] = 0;
}

d_Vec3f::d_Vec3f(const d_Vec3f &v)
{
	p[0] = v[0];
	p[1] = v[1];
	p[2] = v[2];
}

d_Vec3f::d_Vec3f(float x, float y, float z)
{
	p[0] = x;
	p[1] = y;
	p[2] = z;
}

float &d_Vec3f::operator [] (int i)
{
	if(i>3)
	{
		std::cout << "Bad index for vector!" << std::endl;
		return p[0];
	}
	return p[i];
}

float d_Vec3f::operator [] (int i) const
{
	if(i>3)
	{
		std::cout << "Bad index for vector!" << std::endl;
		return p[0];
	}
	return p[i];
}

d_Vec3f d_Vec3f::operator + (const d_Vec3f v) const
{
	d_Vec3f res(p[0]+v[0], p[1]+v[1], p[2]+v[2]);
	return res;
}

d_Vec3f d_Vec3f::operator - (const d_Vec3f v) const
{
	d_Vec3f res(p[0]-v[0], p[1]-v[1], p[2]-v[2]);
	return res;
}

void d_Vec3f::operator +=(const d_Vec3f v)
{
	p[0]+=v[0];
	p[1]+=v[1];
	p[2]+=v[2];
}

void d_Vec3f::operator -=(const d_Vec3f v)
{
	p[0]-=v[0];
	p[1]-=v[1];
	p[2]-=v[2];
}

d_Vec3f d_Vec3f::operator * (const d_Vec3f a) const
{
	return d_Vec3f(p[0]*a[0],p[1]*a[1],p[2]*a[2]);
}

d_Vec3f d_Vec3f::operator * (const float a) const
{
	d_Vec3f res(p[0]*a, p[1]*a, p[2]*a);
	return res;
}

d_Vec3f d_Vec3f::operator / (const float a) const
{
	d_Vec3f res(p[0]/a, p[1]/a, p[2]/a);
	return res;
}

/////////////d_Vec3f helper funcs//////////////////
float d_Math::len(const d_Vec3f a)
{
	return sqrt(a[0]*a[0] + a[1]*a[1] + a[2]*a[2]);
}

d_Vec3f d_Math::norm(const d_Vec3f a)
{
	float length = len((const d_Vec3f) a);
	return d_Vec3f(a[0]/length, a[1]/length, a[2]/length);
}

float d_Math::dot(const d_Vec3f a, const d_Vec3f b)
{
	return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];
}

d_Vec3f d_Math::cross(const d_Vec3f a, const d_Vec3f b)
{
    return d_Vec3f(a[1]*b[2]-a[2]*b[1], a[2]*b[0]-a[0]*b[2], a[0]*b[1]-a[1]*b[0]);
}

